 /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.acionista.view;

import br.jm.acionista.base.eao.EaoException;
import br.jm.acionista.entity.*;
import br.jm.acionista.filter.Funcoes;
import br.jm.acionista.sistema.eao.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.EntityManager;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author joao
 */
public class RelatorioLivroBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private RelatorioLivro selectedRelatorioLivro;
    private Cliente selectedCliente;
    private Cautela selectedCautela;
    private CautelaAcionista selectedCautelaAcionista;
    private Subscricao selectedSubscricao;
    private Averbacao selectedAverbacao;
    private Livro selectedLivro;
    private Livro selectedLivroTemp;
    private RelatorioLivroEao relatorioJpa;
    private ClienteEao ClienteJpa;
    private CautelaEao CautelaJpa;
    private CautelaAcionistaEao CautelaAcionistaJpa;
    private SubscricaoEao subscricaoJpa;
    private AverbacaoEao averbacaoJpa;
    private LivroEao livroJpa;
    private EntityManager sessao;
    private FacesMessage msg = null;
    private List<Cliente> clienteList;
    private AnotacaoEao anotacaoJpa;
    private Anotacao selectedAnotacao;
    private String cAnotacao;
    private String cLivro;
    private boolean gera = true;
    private Funcoes funcoes;

    public RelatorioLivroBean() {
        relatorioJpa = RelatorioLivroEao.getInstance();
        ClienteJpa = ClienteEao.getInstance();
        CautelaJpa = CautelaEao.getInstance();
        CautelaAcionistaJpa = CautelaAcionistaEao.getInstance();
        subscricaoJpa = SubscricaoEao.getInstance();
        averbacaoJpa = AverbacaoEao.getInstance();
        livroJpa = LivroEao.getInstance();
        anotacaoJpa = AnotacaoEao.getInstance();

        selectedRelatorioLivro = new RelatorioLivro();
        selectedCliente = new Cliente();
        selectedCautela = new Cautela();
        selectedCautelaAcionista = new CautelaAcionista();
        selectedSubscricao = new Subscricao();
        selectedAverbacao = new Averbacao();
        selectedLivro = new Livro();
        selectedAnotacao = new Anotacao();

        funcoes = new Funcoes();
    }

    public void gerarLivro(ActionEvent actionEvent) throws EaoException {
        String cFiltro;
        boolean lPassa = true;
        int nFolha = 2;
        BigDecimal nCont = BigDecimal.ZERO;

        if (selectedLivro == null || selectedLivro.getIdLivro() == null) {
            lPassa = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Selecione o Numero do Livro!", "");
        }

        try {
            if (lPassa) {
                this.sessao = relatorioJpa.openSessaoLote();
                relatorioJpa.openTransaction(this.sessao);

                // Limpa o Livro Selecionado
                relatorioJpa.executeUpdate("DELETE FROM RELATORIO_LIVRO", "S", this.sessao);

                clienteList = ClienteJpa.getNative("Cliente", 0, ClienteJpa.getCount("Cliente"), "nomCliente", true, null, null, null);

                for (int i = 0; i < clienteList.size(); i++) {
                    nCont = BigDecimal.ZERO;

                    selectedCliente = clienteList.get(i);
                    cFiltro = " id_cliente = ".concat(selectedCliente.getIdCliente().toString()).concat(" and id_livro = ").concat(selectedLivro.getIdLivro().toString());

                    if (selectedCliente.getIdLivro() != null) {
                        // Grava Saldo Anterior
                        selectedRelatorioLivro = new RelatorioLivro();

                        selectedLivroTemp = livroJpa.getPorId(selectedCliente.getIdLivro().getIdLivro());

                        selectedAnotacao = anotacaoJpa.getPorId(1);
                        cAnotacao = selectedAnotacao.getDscAnotacao().replace("@!", selectedCliente.getNumFolha()).replace("@#", selectedLivroTemp.getNumLivro()).replace("@$", selectedLivro.getNumLivro()).replace("@%", "");

                        selectedRelatorioLivro.setIdRelLivro(null);
                        selectedRelatorioLivro.setDatProcesso(selectedCliente.getDatSaldoAnterior());
                        selectedRelatorioLivro.setIdAnotacao(1);
                        selectedRelatorioLivro.setIdCliente(selectedCliente.getIdCliente());
                        selectedRelatorioLivro.setIdLivro(selectedLivro.getIdLivro());
                        selectedRelatorioLivro.setIdLivroAnterior(selectedCliente.getIdLivro().getIdLivro());
                        selectedRelatorioLivro.setQdeAdquiridas(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeAlienacao(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeJudicial(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdePenhor(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdePortador(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeSubscrita(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeTransferidas(BigDecimal.ZERO);
                        selectedRelatorioLivro.setSaldoAnterior(selectedCliente.getSaldoAnterior());
                        selectedRelatorioLivro.setVlrRealizado(BigDecimal.ZERO);
                        selectedRelatorioLivro.setVlrRealizar(BigDecimal.ZERO);
                        selectedRelatorioLivro.setSaldoAtual(BigDecimal.ZERO);
                        selectedRelatorioLivro.setDscAnotacao(cAnotacao);

                        relatorioJpa.create(selectedRelatorioLivro, "S", this.sessao);
                        nCont = nCont.add(new BigDecimal(1));
                    }

                    // Grava Adquiridas
                    cFiltro = " Cautela_Acionista.id_cliente = ".concat(selectedCliente.getIdCliente().toString()).concat(" and Cautela_Acionista.id_livro = ").concat(selectedLivro.getIdLivro().toString());
                    List<CautelaAcionista> cautelaAcionistaList = CautelaAcionistaJpa.getNative("CautelaAcionista", 0, CautelaAcionistaJpa.getCount("CautelaAcionista"), "idAnotacao", true, null, null, cFiltro);

                    for (int j = 0; j < cautelaAcionistaList.size(); j++) {
                        selectedCautelaAcionista = new CautelaAcionista();
                        selectedCautelaAcionista = cautelaAcionistaList.get(j);

                        selectedRelatorioLivro = new RelatorioLivro();
                        selectedRelatorioLivro.setIdRelLivro(null);

                        selectedAnotacao = anotacaoJpa.getPorId(selectedCautelaAcionista.getIdAnotacao().getIdAnotacao());
                        cAnotacao = selectedAnotacao.getDscAnotacao().replace("@!", selectedCliente.getNumFolha()).replace("@#", selectedLivroTemp.getNumLivro()).replace("@$", selectedLivro.getNumLivro()).replace("@%", selectedCautelaAcionista.getNumTransferencia().toString());

                        selectedRelatorioLivro.setDatProcesso(selectedCautelaAcionista.getDatCautela());
                        selectedRelatorioLivro.setIdAnotacao(selectedCautelaAcionista.getIdAnotacao().getIdAnotacao());
                        selectedRelatorioLivro.setIdCliente(selectedCliente.getIdCliente());
                        selectedRelatorioLivro.setIdLivro(selectedCautelaAcionista.getIdLivro().getIdLivro());

                        if (selectedCliente.getIdLivro() != null) {
                            selectedRelatorioLivro.setIdLivroAnterior(selectedCliente.getIdLivro().getIdLivro());
                        } else {
                            selectedRelatorioLivro.setIdLivroAnterior(selectedLivro.getIdLivro());
                        }
                        selectedRelatorioLivro.setQdeAdquiridas(selectedCautelaAcionista.getQdeReceb());
                        selectedRelatorioLivro.setQdeAlienacao(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeJudicial(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdePenhor(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdePortador(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeSubscrita(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeTransferidas(BigDecimal.ZERO);
                        selectedRelatorioLivro.setSaldoAnterior(null);
                        selectedRelatorioLivro.setVlrRealizado(BigDecimal.ZERO);
                        selectedRelatorioLivro.setVlrRealizar(BigDecimal.ZERO);
                        selectedRelatorioLivro.setNumTransferencia(selectedCautelaAcionista.getNumTransferencia());
                        selectedRelatorioLivro.setSaldoAtual(BigDecimal.ZERO);
                        selectedRelatorioLivro.setDscAnotacao(cAnotacao);

                        relatorioJpa.create(selectedRelatorioLivro, "S", this.sessao);
                        nCont = nCont.add(new BigDecimal(1));
                    }

                    // Grava Transferidas
                    cFiltro = " Cautela.id_cliente = ".concat(selectedCliente.getIdCliente().toString()).concat(" and Cautela.id_livro = ").concat(selectedLivro.getIdLivro().toString());
                    List<Cautela> cautelaList = CautelaJpa.getNative("Cautela", 0, CautelaJpa.getCount("Cautela"), "idAnotacao", true, null, null, cFiltro);

                    for (int j = 0; j < cautelaList.size(); j++) {
                        selectedCautela = new Cautela();
                        selectedCautela = cautelaList.get(j);

                        selectedRelatorioLivro = new RelatorioLivro();

                        if (selectedCautela.getIdAnotacao().getIdAnotacao() == 7) {
                            selectedRelatorioLivro.setQdeTransferidas(BigDecimal.ZERO);
                            selectedRelatorioLivro.setQdeJudicial(selectedCautela.getQdeTotal());
                        } else {

                            selectedRelatorioLivro.setQdeTransferidas(selectedCautela.getQdeTotal());
                            selectedRelatorioLivro.setQdeJudicial(BigDecimal.ZERO);
                        }

                        selectedAnotacao = anotacaoJpa.getPorId(selectedCautela.getIdAnotacao().getIdAnotacao());
                        cAnotacao = selectedAnotacao.getDscAnotacao().replace("@!", selectedCliente.getNumFolha()).replace("@#", selectedLivroTemp.getNumLivro()).replace("@$", selectedLivro.getNumLivro()).replace("@%", selectedCautela.getNumTransferencia().toString());

                        selectedRelatorioLivro.setIdRelLivro(null);
                        selectedRelatorioLivro.setDatProcesso(selectedCautela.getDatCautela());
                        selectedRelatorioLivro.setIdAnotacao(selectedCautela.getIdAnotacao().getIdAnotacao());
                        selectedRelatorioLivro.setIdCliente(selectedCliente.getIdCliente());
                        selectedRelatorioLivro.setIdLivro(selectedCautela.getIdLivro().getIdLivro());

                        if (selectedCliente.getIdLivro() != null) {
                            selectedRelatorioLivro.setIdLivroAnterior(selectedCliente.getIdLivro().getIdLivro());
                        } else {
                            selectedRelatorioLivro.setIdLivroAnterior(selectedLivro.getIdLivro());
                        }

                        selectedRelatorioLivro.setQdeAdquiridas(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeAlienacao(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdePenhor(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdePortador(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeSubscrita(BigDecimal.ZERO);
                        selectedRelatorioLivro.setSaldoAnterior(null);
                        selectedRelatorioLivro.setVlrRealizado(BigDecimal.ZERO);
                        selectedRelatorioLivro.setVlrRealizar(BigDecimal.ZERO);
                        selectedRelatorioLivro.setSaldoAtual(BigDecimal.ZERO);
                        selectedRelatorioLivro.setNumTransferencia(selectedCautela.getNumTransferencia());
                        selectedRelatorioLivro.setDscAnotacao(cAnotacao);

                        relatorioJpa.create(selectedRelatorioLivro, "S", this.sessao);
                        nCont = nCont.add(new BigDecimal(1));
                    }

                    // Grava Subscricao
                    cFiltro = " subscricao.id_cliente = ".concat(selectedCliente.getIdCliente().toString()).concat(" and subscricao.id_livro = ").concat(selectedLivro.getIdLivro().toString());
                    List<Subscricao> subscricaoList = subscricaoJpa.getNative("Subscricao", 0, subscricaoJpa.getCount("Subscricao"), "idAnotacao", true, null, null, cFiltro);

                    for (int j = 0; j < subscricaoList.size(); j++) {
                        selectedSubscricao = new Subscricao();
                        selectedSubscricao = subscricaoList.get(j);

                        selectedAnotacao = anotacaoJpa.getPorId(selectedSubscricao.getIdAnotacao().getIdAnotacao());
                        cAnotacao = selectedAnotacao.getDscAnotacao().replace("@!", selectedCliente.getNumFolha()).replace("@#", selectedLivroTemp.getNumLivro()).replace("@$", selectedLivro.getNumLivro()).replace("@%", " ");

                        selectedRelatorioLivro = new RelatorioLivro();
                        selectedRelatorioLivro.setIdRelLivro(null);
                        selectedRelatorioLivro.setDatProcesso(selectedSubscricao.getDatSubscricao());
                        selectedRelatorioLivro.setIdAnotacao(selectedSubscricao.getIdAnotacao().getIdAnotacao());
                        selectedRelatorioLivro.setIdCliente(selectedCliente.getIdCliente());
                        selectedRelatorioLivro.setIdLivro(selectedSubscricao.getIdLivro());

                        if (selectedCliente.getIdLivro() != null) {
                            selectedRelatorioLivro.setIdLivroAnterior(selectedCliente.getIdLivro().getIdLivro());
                        } else {
                            selectedRelatorioLivro.setIdLivroAnterior(selectedLivro.getIdLivro());
                        }

                        selectedRelatorioLivro.setQdeAdquiridas(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeTransferidas(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeSubscrita(selectedSubscricao.getQdeSubscrita());
                        selectedRelatorioLivro.setVlrRealizado(selectedSubscricao.getVlrRealizado());
                        selectedRelatorioLivro.setVlrRealizar(selectedSubscricao.getVlrRealizar());
                        selectedRelatorioLivro.setQdeAlienacao(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeJudicial(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdePenhor(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdePortador(BigDecimal.ZERO);
                        selectedRelatorioLivro.setSaldoAnterior(null);
                        selectedRelatorioLivro.setSaldoAtual(BigDecimal.ZERO);
                        selectedRelatorioLivro.setDscAnotacao(cAnotacao);

                        relatorioJpa.create(selectedRelatorioLivro, "S", this.sessao);
                        nCont = nCont.add(new BigDecimal(1));
                    }

                    // Grava Averbacao
                    cFiltro = " averbacao.id_cliente = ".concat(selectedCliente.getIdCliente().toString()).concat(" and averbacao.id_livro = ").concat(selectedLivro.getIdLivro().toString());
                    List<Averbacao> averbacaoList = averbacaoJpa.getNative("Averbacao", 0, averbacaoJpa.getCount("Averbacao"), "idAnotacao", true, null, null, cFiltro);

                    for (int j = 0; j < averbacaoList.size(); j++) {
                        selectedAverbacao = new Averbacao();
                        selectedAverbacao = averbacaoList.get(j);

                        selectedAnotacao = anotacaoJpa.getPorId(selectedAverbacao.getIdAnotacao().getIdAnotacao());
                        cAnotacao = selectedAnotacao.getDscAnotacao().replace("@!", selectedCliente.getNumFolha()).replace("@#", selectedLivroTemp.getNumLivro()).replace("@$", selectedLivro.getNumLivro()).replace("@%", " ");

                        selectedRelatorioLivro = new RelatorioLivro();
                        selectedRelatorioLivro.setIdRelLivro(null);
                        selectedRelatorioLivro.setDatProcesso(selectedAverbacao.getDatAverbacao());
                        selectedRelatorioLivro.setIdAnotacao(selectedAverbacao.getIdAnotacao().getIdAnotacao());
                        selectedRelatorioLivro.setIdCliente(selectedCliente.getIdCliente());
                        selectedRelatorioLivro.setIdLivro(selectedAverbacao.getIdLivro());
                        if (selectedCliente.getIdLivro() != null) {
                            selectedRelatorioLivro.setIdLivroAnterior(selectedCliente.getIdLivro().getIdLivro());
                        } else {
                            selectedRelatorioLivro.setIdLivroAnterior(selectedLivro.getIdLivro());
                        }

                        selectedRelatorioLivro.setQdeAdquiridas(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeTransferidas(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeSubscrita(BigDecimal.ZERO);
                        selectedRelatorioLivro.setVlrRealizado(BigDecimal.ZERO);
                        selectedRelatorioLivro.setVlrRealizar(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdeAlienacao(selectedAverbacao.getQdeAlienacao());
                        selectedRelatorioLivro.setQdeJudicial(BigDecimal.ZERO);
                        selectedRelatorioLivro.setQdePenhor(selectedAverbacao.getQdePenhor());
                        selectedRelatorioLivro.setQdePortador(selectedAverbacao.getQdePortador());
                        selectedRelatorioLivro.setSaldoAnterior(null);
                        selectedRelatorioLivro.setSaldoAtual(BigDecimal.ZERO);
                        selectedRelatorioLivro.setDscAnotacao(cAnotacao);

                        relatorioJpa.create(selectedRelatorioLivro, "S", this.sessao);
                        nCont = nCont.add(new BigDecimal(1));
                    }

                    // Grava Saldo Atual
                    selectedRelatorioLivro = new RelatorioLivro();

                    selectedAnotacao = anotacaoJpa.getPorId(10);
                    cAnotacao = selectedAnotacao.getDscAnotacao().replace("@!", selectedCliente.getNumFolha()).replace("@#", selectedLivroTemp.getNumLivro()).replace("@$", selectedLivro.getNumLivro()).replace("@%", " ");

                    // Gera data do ultimo dia do ano do Livro atual
                    String cDatFechamento = funcoes.ConverteDateString(selectedLivro.getDatAbertura());
                    String cAnoFechamento = cDatFechamento.substring(6);
                    cDatFechamento = "31/12/".concat(cAnoFechamento);
                    Date datFechamento = funcoes.ConverteData(cDatFechamento);

                    selectedRelatorioLivro.setIdRelLivro(null);
                    selectedRelatorioLivro.setDatProcesso(datFechamento);
                    selectedRelatorioLivro.setIdAnotacao(selectedAnotacao.getIdAnotacao());
                    selectedRelatorioLivro.setIdCliente(selectedCliente.getIdCliente());
                    selectedRelatorioLivro.setIdLivro(selectedLivro.getIdLivro());

                    if (selectedCliente.getIdLivro() != null) {
                        selectedRelatorioLivro.setIdLivroAnterior(selectedCliente.getIdLivro().getIdLivro());
                    } else {
                        selectedRelatorioLivro.setIdLivroAnterior(selectedLivro.getIdLivro());
                    }
                    selectedRelatorioLivro.setQdeAdquiridas(BigDecimal.ZERO);
                    selectedRelatorioLivro.setQdeAlienacao(BigDecimal.ZERO);
                    selectedRelatorioLivro.setQdeJudicial(BigDecimal.ZERO);
                    selectedRelatorioLivro.setQdePenhor(BigDecimal.ZERO);
                    selectedRelatorioLivro.setQdePortador(BigDecimal.ZERO);
                    selectedRelatorioLivro.setQdeSubscrita(BigDecimal.ZERO);
                    selectedRelatorioLivro.setQdeTransferidas(BigDecimal.ZERO);
                    selectedRelatorioLivro.setSaldoAnterior(selectedCliente.getQdeAcao());
                    selectedRelatorioLivro.setVlrRealizado(BigDecimal.ZERO);
                    selectedRelatorioLivro.setVlrRealizar(BigDecimal.ZERO);
                    selectedRelatorioLivro.setSaldoAtual(selectedCliente.getQdeAcao());
                    selectedRelatorioLivro.setDscAnotacao(cAnotacao);

                    relatorioJpa.create(selectedRelatorioLivro, "S", this.sessao);

                    // Calcula Pagina Atual
                    nCont = nCont.add(new BigDecimal(1));
                    BigDecimal nDivide = BigDecimal.ZERO;

                    if (nCont.compareTo(new BigDecimal(24)) > 0) {
                        if (nCont.compareTo(new BigDecimal(48)) == 0) {
                            nDivide = new BigDecimal(1);
                        } else {
                            nCont = nCont.setScale(0, RoundingMode.DOWN);
                            nDivide = nCont.divide(new BigDecimal(24), BigDecimal.ROUND_DOWN);
                        }

                        nFolha = nFolha + nDivide.intValue();

                        selectedCliente.setNumFolhaAtual(Integer.toString(nFolha));
                        ClienteJpa.edit(selectedCliente);

                        nFolha++;
                    } else {
                        selectedCliente.setNumFolhaAtual(Integer.toString(nFolha));
                        ClienteJpa.edit(selectedCliente);

                        nFolha++;
                    }
                }

                relatorioJpa.closeTransaction(this.sessao);


                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "ATENÇÃO ... Geração do Livro de Ações criado com Sucesso!", "");
            }
        } catch (Exception ex) {
            if (this.sessao.isOpen()) {
                relatorioJpa.closeSessaoRollback(this.sessao);
            }
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Erro do Sistema... Tente Novamente!", "");
        } finally {
            selectedLivro = null;
            this.sessao = null;
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public EntityManager getSessao() {
        return sessao;
    }

    public void setSessao(EntityManager sessao) {
        this.sessao = sessao;
    }

    public Livro getSelectedLivro() {
        if (selectedLivro == null) {
            selectedLivro = new Livro();
        }
        return selectedLivro;
    }

    public void setSelectedLivro(Livro selectedLivro) {
        this.selectedLivro = selectedLivro;
    }

    public boolean isGera() {
        return gera;
    }

    public void setGera(boolean gera) {
        this.gera = gera;
    }

    public void verificaLivro(SelectEvent event) {
        try {
            Livro livro = new Livro();
            livro = (Livro) event.getObject();

            if (livro.getDatFechamento() == null) {
                this.gera = true;
            } else {
                this.gera = false;
            }

        } catch (Exception ex) {
            Logger.getLogger(RelatorioLivroBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
